home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Systemmonitors / Snoopy / Support / break.asm < prev    next >
Assembly Source File  |  1996-09-26  |  9KB  |  361 lines

  1.  
  2.         incpath    include:
  3.         maclib    sm.mac
  4.         macfile    macro.i
  5.  
  6. VERSION        equ    37
  7. REVISION    equ    2
  8.         
  9.         STRUCTURE BreakStack,0
  10.         APTR    stack_DosBase
  11.         APTR    stack_ReadArgs
  12.         APTR    stack_Process
  13.         APTR    stack_Name
  14.         APTR    stack_Task
  15.         APTR    stack_Mask
  16.         ULONG    stack_All
  17.         ULONG    stack_C
  18.         ULONG    stack_D
  19.         ULONG    stack_E
  20.         ULONG    stack_F
  21.         ULONG    stack_Argument
  22.         LABEL    stack_SIZEOF
  23.  
  24.         ENTRY    main,d1-d7/a0-a6,stack_SIZEOF,a5
  25.  
  26. ;--------------    open dos.library
  27.         lea    (dosName,pc),a1
  28.         moveq    #36,d0
  29.         CALL    OpenLibrary,<(execBase).w>
  30.         move.l    d0,(stack_DosBase,a5)
  31.         beq    .NODOSBASE
  32.         movea.l    d0,a6    ; load dos.library to a6
  33.  
  34. ;--------------    read arguments
  35.         lea    (argTemplate,pc),a0
  36.         move.l    a0,d1
  37.         lea    (stack_Process,a5),a0
  38.         move.l    a0,d2
  39.         moveq    #0,d3
  40.         CALL    ReadArgs
  41.         move.l    d0,(stack_ReadArgs,a5)
  42.         beq    .DOSERROR
  43.  
  44. ;--------------    setup bitmask. the priority settings are
  45. ;--------------    
  46. ;--------------     - flag ALL is set -> set all bits
  47. ;--------------     - mask defined -> change bits set in this mask
  48. ;--------------     - special bit request (e.g.CTRL_C) -> change bit
  49. ;--------------     - if nothing else, send at least CTRL_C
  50. ;--------------    
  51.         moveq    #0,d0
  52.         tst.l    (stack_All,a5)
  53.         beq.b    .NotAll
  54.         move.l    #SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D|SIGBREAKF_CTRL_E|SIGBREAKF_CTRL_F,d0
  55. .NotAll        tst.l    (stack_Mask,a5)
  56.         beq.b    .NoMask
  57.         move.l    d0,d2
  58.         movea.l    (stack_Mask,a5),a0
  59.         moveq    #STVFORMAT_BIN,d0
  60.         bsr    StringToValue
  61.         or.l    d0,d2
  62.         move.l    d2,d0
  63. .NoMask        tst.l    (stack_C,a5)
  64.         beq.b    .NotCtrlC
  65.         bchg    #SIGBREAKB_CTRL_C,d0
  66. .NotCtrlC    tst.l    (stack_D,a5)
  67.         beq.b    .NotCtrlD
  68.         bchg    #SIGBREAKB_CTRL_D,d0
  69. .NotCtrlD    tst.l    (stack_E,a5)
  70.         beq.b    .NotCtrlE
  71.         bchg    #SIGBREAKB_CTRL_E,d0
  72. .NotCtrlE    tst.l    (stack_F,a5)
  73.         beq.b    .NotCtrlF
  74.         bchg    #SIGBREAKB_CTRL_F,d0
  75. .NotCtrlF    tst.l    d0
  76.         bne.b    .Nothing
  77.         move.l    #SIGBREAKF_CTRL_C,d0
  78. .Nothing    move.l    d0,d6
  79.  
  80. ;--------------    find process
  81.         tst.l    (stack_Process,a5)
  82.         beq    .NoProcess
  83.         movea.l    (stack_Process,a5),a0
  84. .ProcessLoop    move.l    (a0)+,d7    ; find NULL ptr
  85.         beq    .Ready
  86.         move.l    a0,(stack_Process,a5) ; next process-ptr
  87.          movea.l    d7,a0 
  88.         move.l    (a0),d7
  89.         movea.l    (execBase).w,a6
  90.         lea    (TaskWait,a6),a1
  91.         movea.l    (LH_HEAD,a1),a1
  92. .FindProcess    tst.l    (LN_SUCC,a1)
  93.         beq.b    .ProcNotFound
  94.         cmpi.b    #NT_PROCESS,(LN_TYPE,a1)
  95.         bne.b    .IsNotAProcess
  96.         tst.l    (pr_TaskNum,a1)
  97.         beq.b    .IsNotAProcess
  98.         cmp.l    (pr_TaskNum,a1),d7
  99.         bne.b    .IsNotAProcess
  100.         bsr.b    .MProcessFound
  101.         movea.l    (stack_Process,a5),a0
  102.         bra.b    .ProcessLoop
  103. .IsNotAProcess    movea.l    (LN_SUCC,a1),a1
  104.         bra.b    .FindProcess
  105.  
  106. ;--------------    found a process -> send signal mask
  107. .MProcessFound    move.l    d6,d0
  108.         CALL    Signal
  109.         rts
  110.  
  111. ;--------------    process found -> send signal mask
  112. .ProcessFound    move.l    d6,d0
  113.         CALL    Signal,<(execBase).w>
  114.         bra.b    .Ready
  115.  
  116. ;--------------    process not found -> send error message
  117. .ProcNotFound    lea    (NoProcessMsg,pc),a0
  118.         lea    (stack_Argument,a5),a1
  119.         move.l    d7,(stack_Argument,a5)
  120.  
  121. ;--------------    => a0:APTR String
  122. ;--------------       a1:APTR Argumente
  123. .Ausgabe    move.l    a0,d1
  124.         move.l    a1,d2
  125.         CALL    VPrintf,<(stack_DosBase,a5)>
  126.         bra.b    .Ready
  127.  
  128. ;--------------    find task by name
  129. .NoProcess    tst.l    (stack_Name,a5)
  130.         beq.b    .NoName
  131.         movea.l    (stack_Name,a5),a1
  132.         bsr    FindTask
  133.         tst.l    d0
  134.         beq.b    .NameNotFound
  135.         movea.l    d0,a1
  136.         bra.b    .ProcessFound
  137. .NameNotFound    lea    (NoNameMsg,pc),a0
  138.         lea    (stack_Name,a5),a1
  139.         bra.b    .Ausgabe
  140.  
  141. ;--------------    find task by address
  142. .NoName        tst.l    (stack_Task,a5)
  143.         beq.b    .NoAddr
  144.         movea.l    (stack_Task,a5),a0
  145.         moveq    #STVFORMAT_HEX,d0
  146.         bsr    StringToValue
  147.         tst.l    d0
  148.         beq.b    .AddrNotFound
  149.         bclr    #0,d0    ; skip odd addr
  150.         movea.l    d0,a1
  151.         cmpi.b    #NT_PROCESS,(LN_TYPE,a1)
  152.         beq.b    .ProcessFound
  153.         cmpi.b    #NT_TASK,(LN_TYPE,a1)
  154.         beq.b    .ProcessFound
  155. .AddrNotFound    lea    (NoAddrMsg,pc),a0
  156.         lea    (stack_Argument,a5),a1
  157.         move.l    d0,(a1)
  158.         bra    .Ausgabe
  159. .NoAddr        moveq    #ERROR_REQUIRED_ARG_MISSING,d1
  160.         moveq    #0,d2
  161.         CALL    PrintFault,<(stack_DosBase,a5)>
  162.  
  163. ;--------------    close everything
  164. .Ready        bsr.b    FreeDosArgs
  165.         moveq    #RETURN_OK,d0
  166.         bra.b    main_done
  167.  
  168. ;--------------    error opening the dos.library
  169. .NODOSBASE    moveq    #RETURN_FAIL,d0
  170.         bra.b    main_done
  171.         
  172. ;--------------    show dos.library error
  173. .DOSERROR    bsr    ShowDosError
  174.         bsr.b    FreeDosArgs
  175.         moveq    #RETURN_ERROR,d0
  176.         DONE    main
  177.  
  178. *******************************************************************************
  179. ;--------------    free dos arguments
  180. ;--------------    
  181.         ENTRY    FreeDosArgs
  182.         move.l    (stack_ReadArgs,a5),d1
  183.         beq.b    1$
  184.         clr.l    (stack_ReadArgs,a5)
  185.         CALL    FreeArgs,<(stack_DosBase,a5)>
  186. 1$        DONE    FreeDosArgs
  187.  
  188. *******************************************************************************
  189. ;--------------    Diese Funktion konvertiert einen String in eine Zahl, wobei der
  190. ;--------------    String in Hexadezimal($),Dezimal(#),Oktal(@) oder Dual(%) vorliegen
  191. ;--------------    kann. Zusätzlich kann eine Voreinstellung angenommen werden, um
  192. ;--------------    z.B. ständige '#' bei rein Dezimalen Strings zu überbrücken.
  193. ;--------------    Irgendwann mal in absolut ferner Zukunft habe ich vor, hier noch
  194. ;--------------    einen 'Calculator' reinzuhängen: Damit wäre in jedem Programm,
  195. ;--------------    daß über StringToValue aus Strings Zahlen macht, gleich eine
  196. ;--------------    Taschenrechnerfunktion drinnen..
  197. ;--------------    => d0: ULONG Vordefinierter Typ des Strings
  198. ;--------------       a0: APTR Der String mit der Zahl
  199. ;--------------    <= d0: LONG Die (vorzeichenbehaftete) IntegerZahl
  200.  
  201. ;--------------    Voreinstellungen für StringToValue()
  202. STVFORMAT_DEC    equ    0
  203. STVFORMAT_HEX    equ    1
  204. STVFORMAT_OCT    equ    2
  205. STVFORMAT_BIN    equ    3
  206.  
  207. ;--------------    Identifikatoren für StringToValue()
  208. STVTYPE_DEC    equ    '#'
  209. STVTYPE_HEX    equ    '$'
  210. STVTYPE_OCT    equ    '@'
  211. STVTYPE_BIN    equ    '%'
  212.  
  213.         ENTRY    StringToValue,d1-d2
  214.         moveq    #10,d2
  215.         cmpi.b    #STVFORMAT_HEX,d0
  216.         bne.b    .NotHex
  217.         moveq    #16,d2
  218. .NotHex        cmpi.b    #STVFORMAT_BIN,d0
  219.         bne.b    .NotBin
  220.         moveq    #2,d2
  221. .NotBin        cmpi.b    #STVFORMAT_OCT,d0
  222.         bne.b    .NotOct
  223.         moveq    #8,d2
  224. .NotOct        cmpi.b    #'-',(a0)
  225.         bne.b    .NormalUse
  226.         addq.l    #1,a0
  227.         bsr.b    .Check4Sign
  228.         bsr.b    .Get_s2v
  229.         neg.l    d0
  230.         bra    StringToValue_done
  231.  
  232. .NormalUse    bsr.b    .Check4Sign
  233.         bsr.b    .Get_s2v
  234.         bra    StringToValue_done
  235.  
  236. .Check4Sign    move.b    (a0),d0
  237.         cmpi.b    #STVTYPE_DEC,d0
  238.         bne.b    1$
  239.         moveq    #10,d2
  240.         addq.l    #1,a0
  241. 1$        cmpi.b    #STVTYPE_HEX,d0
  242.         bne.b    2$
  243.         moveq    #16,d2
  244.         addq.l    #1,a0
  245. 2$        cmpi.b    #STVTYPE_OCT,d0
  246.         bne.b    3$
  247.         moveq    #8,d2
  248.         addq.l    #1,a0
  249. 3$        cmpi.b    #STVTYPE_BIN,d0
  250.         bne.b    4$
  251.         moveq    #2,d2
  252.         addq.l    #1,a0
  253. 4$        moveq    #0,d0
  254.         rts
  255.  
  256. .Get_s2v    moveq    #0,d1
  257.         move.b    (a0)+,d1
  258.         cmpi.b    #'a',d1
  259.         blt.b    .NoUpcaseChose
  260.         cmpi.b    #'z',d1
  261.         bgt.b    .NoUpcaseChose
  262.         sub.b    #('a'-'A'),d1 
  263. .NoUpcaseChose     subi.b    #"0",d1
  264.         cmpi.b    #10,d1
  265.         bls.b    .s2v_Overdose
  266.         cmpi.l    #16,d2
  267.         bne.s    .s2v_Overdose
  268.         subq.b    #'A'-('9'+1),d1
  269. .s2v_Overdose    cmp.b    d2,d1
  270.         bcc.b    .s2v_Done
  271.         bsr.b    ExtendedMulu
  272.         add.w    d1,d0
  273.         bra.b    .Get_s2v
  274. .s2v_Done    rts
  275.         DONE    StringToValue
  276.  
  277. ;--------------    Diese Funktion Multipliziert zwei Langwerte
  278. ;--------------    => d1: LONG Wert 1 
  279. ;--------------       d2: LONG Wert 2
  280. ;--------------    <= d0: LONG Result
  281.         ENTRY    ExtendedMulu,d1/d2
  282.         cmpi.l    #$7FFF,d2
  283.         bcc.b    2$
  284.         cmpi.l    #$7FFF,d0
  285.         bcc.b    2$
  286.         mulu    d2,d0
  287.         bra.b    ExtendedMulu_done
  288. 2$        moveq    #0,d1
  289.         subq.l    #1,d2
  290. 1$        add.l    d0,d1
  291.         dbra    d2,1$
  292.         move.l    d1,d0
  293.         DONE    ExtendedMulu
  294.  
  295. *******************************************************************************
  296. ;--------------    => a1: STRPTR taskname
  297. ;--------------    
  298.         ENTRY    FindTask,d5-d7/a0-a6
  299.         CALL    Forbid,<(execBase).w>
  300.         lea    (TaskReady,a6),a0
  301.         bsr.b    .FINDTASK
  302.         tst.l    d0
  303.         bne.b    .FOUND
  304.         lea    (TaskWait,a6),a0
  305.         bsr.b    .FINDTASK
  306. .FOUND        CALL    Permit
  307.         bra.b    FindTask_done
  308.  
  309. .FINDTASK    movea.l    (LH_HEAD,a0),a0
  310. .LOOP        tst.l    (LN_SUCC,a0)
  311.         beq.b    .NOTFOUND
  312.         movea.l    (LN_NAME,a0),a2
  313.         movea.l    a1,a3
  314.         cmpi.b    #NT_PROCESS,(LN_TYPE,a0)
  315.         bne.b    .STRCMP
  316.         tst.l    (pr_TaskNum,a0)
  317.         beq.b    .STRCMP
  318.         move.l    (pr_CLI,a0),d1
  319.         lsl.l    #2,d1
  320.         movea.l    d1,a2
  321.         move.l    (cli_CommandName,a2),d1
  322.         lsl.l    #2,d1
  323.         addq.l    #1,d1
  324.         movea.l    d1,a2
  325. .STRCMP        move.b    (a2)+,d1
  326.         move.b    (a3)+,d2
  327.         cmp.b    d1,d2
  328.         bne.b    .NEXT
  329.         tst.b    d1
  330.         bne.b    .STRCMP
  331.         move.l    a0,d0
  332.         rts
  333. .NEXT        movea.l    (LN_SUCC,a0),a0
  334.         bra.b    .LOOP
  335. .NOTFOUND    moveq    #0,d0
  336.         rts
  337.         DONE    FindTask
  338.  
  339. *******************************************************************************
  340. ;--------------    show dos.library error
  341.         ENTRY    ShowDosError
  342.         CALL    IoErr,<(stack_DosBase,a5)>
  343.         move.l    d0,d1
  344.         moveq    #0,d2
  345.         CALL    PrintFault
  346.         DONE    ShowDosError
  347.  
  348. ;--------------    data area
  349. dosName        cstr    'dos.library'
  350.         cstr    '$VER: break ',_VALOF(VERSION),'.',_VALOF(REVISION),'a (1.8.1992)'
  351. argTemplate    cstr    'PROCESS/N/M,NAME/K,TASK/K,MASK/K,ALL/S,C/S,D/S,E/S,F/S'
  352. NoProcessMsg    cstr    'Process %ld does not exist\n'
  353. NoNameMsg    cstr    'No task named "%s" exists\n'
  354. NoAddrMsg    cstr    '$%lx does not point to a task\n'
  355.         even
  356.  
  357.         end
  358.  
  359. *******************************************************************************
  360. ;--------------    
  361.